package priv.tuyou.constants;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import priv.tuyou.bo.Page;
import priv.tuyou.system.po.SystemUser;

/**
 * web应用的上下文
 * @author：涂有
 * @date 2016年12月19日 下午11:41:33
 */
@Component
public class WebContext implements ApplicationContextAware{
	
	public static ApplicationContext context;

	public static HttpServletRequest getRequest(){
		
		ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
		return attributes.getRequest();
	}
	
	public static HttpSession getSession(){
		
		return getRequest().getSession();
	}
	
	public static ServletContext getServletContext(){
		
		return getRequest().getServletContext();
	}
	
	public static ServletContext getApplication(){
		
		return getServletContext();
	}
	
	/**
	 * 设置登录的用户
	 * @author：涂有
	 * @date 2017年1月5日 下午10:39:49
	 * @param user
	 */
	public static void setSystemUser(SystemUser user){
		
		getSession().setAttribute(WebConstants.SYSTEM_USER, user);
	}
	
	/**
	 * 获取登录的用户
	 * @author：涂有
	 * @date 2017年1月5日 下午10:39:36
	 * @return
	 */
	public static SystemUser getSystemUser(){
		
		return (SystemUser)getSession().getAttribute(WebConstants.SYSTEM_USER);
	}
	
	/**
	 * 设置分页对象，在拦截中会自动设置，需要时也可以手动在其他地方设置
	 * @author：涂有
	 * @date 2017年1月5日 下午10:38:40
	 * @param page
	 */
	public static void setPage(Page<?> page){
		
		getRequest().setAttribute(WebConstants.PAGE_KEY, page);
	}
	
	/**
	 * 得到分页对象
	 * @author：涂有
	 * @date 2017年1月5日 下午10:38:27
	 * @param c
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> Page<T> getPage(Class<T> c){
		
		return (Page<T>)getRequest().getAttribute(WebConstants.PAGE_KEY);
	}
	
	public static <T> T getBean(Class<T> cla){
		
		T obj = context.getBean(cla);
		return obj;
	}
	
	public static <T> T getBean(Class<T> cla, String name){
		
		T obj = context.getBean(name, cla);
		return obj;
	}
	
	public static Object getBean(String name){
		
		Object obj = context.getBean(name);
		return obj;
	}
	
	/**
	 * 得到项目部署的根目录
	 * @author：涂有
	 * @date 2017年1月5日 下午10:37:45
	 * @return
	 */
	public static String getRootPath(){
		
		return getApplication().getRealPath(File.separator);
	}
	
	/**
	 * 得到文件存储的根目录
	 * @author：涂有
	 * @date 2017年1月5日 下午10:37:07
	 * @return
	 */
	public static String getStoreRootDirecotry(){
		
		String directory = getRootPath() + WebConstants.FILE_STORE_DIRECTORY;
		File file = new File(directory);
		if(!file.exists()){
			
			file.mkdirs();
		}
		return directory;
	}
	
	/**
	 * 存储文件。根据传入的类，把图片存在类名的文件夹下面，方便后期图片的管理和清理
	 * @author：涂有
	 * @date 2017年1月5日 下午10:54:30
	 * @param file
	 * @param c
	 * @return
	 */
	public static <T> String storeFile(CommonsMultipartFile file, Class<T> c){
		
		String storeDirectory = getStoreRootDirecotry() + File.separator + c.getSimpleName();
		File direcotry = new File(storeDirectory);
		if(!direcotry.exists()){
			
			direcotry.mkdirs();
		}
		
		//得到文件后缀
		int suffixSeparator = file.getOriginalFilename().lastIndexOf("\\.");
		String suffix = file.getOriginalFilename();
		if(suffixSeparator >= 0){
			
			suffix = file.getOriginalFilename().substring(suffixSeparator + 1);
		}
		
		String fileName = new StringBuilder(UUID.randomUUID().toString()).append(".").append(suffix).toString();
		File pathName = new File(storeDirectory + File.separator + fileName);
		try {
			file.transferTo(pathName);
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return fileName;
	}
	
	/**
	 * 一次性存储多个文件
	 * @author：涂有
	 * @date 2017年1月5日 下午11:54:00
	 * @param file
	 * @param c
	 * @return
	 */
	public static <T> String storeFile(CommonsMultipartFile[] files, Class<T> c){
		
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < files.length; i++){
			
			sb.append(storeFile(files[i], c));
			if(i != files.length - 1){
				
				sb.append(",");
			}
		}
		return sb.toString();
	}

	@Override
	public void setApplicationContext(ApplicationContext arg0) throws BeansException {

		context = arg0;
	}
}
